﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using WcfServices.ServiceInterfaces;
using BLL;
using EntitiesLayer;
using Newtonsoft.Json.Linq;
using WcfServices.Utilities;
using Newtonsoft.Json;

namespace WcfServices
{

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class PlanEntrenamientoService: IPlanEntrenamientoService
    {

        private GestorPlanEntrenamiento gestor;
        private GestorMantenimientoEjercicios gestorE;

        public PlanEntrenamientoService() {

            gestor = new GestorPlanEntrenamiento();
            gestorE = new GestorMantenimientoEjercicios();

        }

        public void evaluarPlan(int idCoordinador, string notaC, char estado)
        {
            throw new NotImplementedException();
        }

        public string consultarPlanDeCliente(int idCliente)
        {
            IList<PlanEntrenamiento> listaPlan =
                Util.interceptWithReturn(() => gestor.consultarPlanesCliente(idCliente));

            if (listaPlan == null)
                return "";

            JArray planesJson = new JArray();

            foreach (PlanEntrenamiento e in listaPlan)
                planesJson.Add(SerializarPlan(e));
            


            return planesJson.ToString(Formatting.None);
            

            
            
        }

        private JObject SerializarPlan(PlanEntrenamiento e){
            
            JObject plan = JObject.FromObject(e);
            plan.Property("Detalles").Remove();
            plan.Property("Estado").Remove();



            var detalle = e.Detalles
                .GroupBy((d) => d.IdEjercicio)
                 .Select((g) => new
                 {
                     idEjercicio = g.Key,
                     nombre = gestorE.GetById(g.Key).Nombre,
                     semanas = g.ToList()
                     
                     .Select( (de) => new {

                         NumeroSemana = de.NumeroSemana,
                         Peso = de.Peso,
                         Repeticiones = de.Repeticiones,
                         Series = de.Series
                     })
                 });

           JArray arrayDetalle =JArray.FromObject(detalle);

           

            plan.Add("ejercicios", arrayDetalle);

            return plan;
        }

        public void Create(Stream json)
        {
            JObject jplan = json.DeserializeJson<JObject>();
            JArray ejercicios = jplan.Value<JArray>("ejercicios");

            PlanEntrenamiento.BuilderPlan planB = new PlanEntrenamiento.BuilderPlan()
             {
                 IdCliente = jplan.Value<int>("IdCliente"),
                 IdFuncionario = jplan.Value<int>("IdFuncionario"),
                 Objetivo = new ObjetivoPE() { Id = jplan.Value<int>("idObjetivo") },
                 FechahoraCreacion = jplan.Value<string>("FechahoraCreacion").ToGlobalDateAplicationFormat(),
                 fechaHoraRevision = jplan.Value<string>("fechaHoraRevision").ToGlobalDateAplicationFormat(),
                 Estado = (EstadoPlan)jplan.Value<char>("EstadoCode"),
                 NotaInstructor = jplan.Value<string>("NotaInstructor"),
                 Detalles = FormatDetallesPlan(ejercicios)

             };

            gestor.RegistarPlan(planB);
            Util.interceptWithNoReturn(gestor.guardarCambios);


        }

        private IList<DetallePlan> FormatDetallesPlan(JArray ejercicios)
        {
            IList<DetallePlan> listaDetalles = new List<DetallePlan>();

            foreach (JObject detalle in ejercicios.Children<JObject>())
            {

                int id = detalle.Value<int>("idEjercicio");

                JArray semanas = detalle.Value<JArray>("semanas");

                foreach (JObject parteD in semanas.Children<JObject>())
                {
                    DetallePlan detallePlan = new DetallePlan()
                    {
                        IdEjercicio = id,
                        NumeroSemana = parteD.Value<int>("NumeroSemana"),
                        Peso = parteD.Value<decimal>("Peso"),
                        Repeticiones = parteD.Value<int>("Repeticiones"),
                        Series = parteD.Value<int>("Series")

                    };

                    listaDetalles.Add(detallePlan);
                }

            }
            
            return listaDetalles;

        }

        public string Listar()
        {
            throw new NotImplementedException();
        }

        public string BuscarPorId(int id)
        {
            PlanEntrenamiento plan = Util.interceptWithReturn(()=>gestor.consultarPlanPorId(id));
            if(plan!=null)
                return SerializarPlan(plan).ToString(Formatting.None);
            
            return "";
        }

        public string listarObjetivos() {

            IEnumerable<ObjetivoPE> objetivos= Util.interceptWithReturn(gestor.listarObjetivos);

            if(objetivos!=null)
                return JsonConvert.SerializeObject(objetivos);

            return "";
        
        }

        public void evaluarPlanEntrenamiento(Stream json)
        {
            JObject jobject = json.DeserializeJson<JObject>();

            PlanEntrenamiento.BuilderPlan planB = new PlanEntrenamiento.BuilderPlan()
            {

                Id = jobject.Value<int>("Id"),
                IdCoordiandor = jobject.Value<int>("IdCoordiandor"),
                NotaCoordiandor = jobject.Value<string>("NotaCoordiandor"),
                Estado = (EstadoPlan)jobject.Value<char>("Estado")


            };
            gestor.modificarPlanEntrenamiento(planB);
            Util.interceptWithNoReturn(gestor.guardarCambios);

        }
    }
}
